#include "tests.h"

// 练习1，实现库函数strlen
int my_strlen(char *str) {
int i=0;
while(*str!='\0'){
    i++;
    str++;
}
return i;
}



// 练习2，实现库函数strcat
void my_strcat(char *str_1, char *str_2) {
int i=1;
while(*str_1!='\0'){
    cout<<*str_1;
    str_1++;
}
while(*str_2!='\0'){
    cout<<*str_2;
    str_2++;
}
return;
}


// 练习3，实现库函数strstr
char* my_strstr(char *s, char *p) {
int n=strlen(p);
int a=0;
char*p1=NULL;
if(strlen(s)<strlen(p)){return NULL;}
else{

    for(int j=0;j<n;j++)
    {
     if(*s!=*p){
         a=0;
         p++;
         s++;
     }

     else{
	 if(p1){
	 a=1;
     p++;
     s++;}
     else{p1=p;
     a=1;
     p++;
     s++;
	 }
    }

}  
}
if(a==1){return p1;
}
else{return NULL;
}
}


/**
 * ================================= 背景知识 ==================================
 * 1. 什么是图片？
 *    图片可以看做是由像素组成的一个方阵，图片分成两种，一种是灰度图片，颜色只有黑白
 * 两种，一种是彩色图片。
 *    灰度图片的每一个像素是一个范围在[0, 255]内的数值，数值越高就越接近白色。
 *    彩色图片的每一个像素都是一个长度为3的数组，数组中的每一个元素都是[0, 255]内的
 * 数值，3个数的含义分别是Red, Green, Blue，表示这个像素所在的位置这3种颜色的强度，
 * 举个例子，纯红色对应的像素就是{255, 0, 0}。这3个数称为图片的3个通道，这种像素表示
 * 方式也称之为图片的RGB表示方式。
 *
 * 2. 图片的属性？
 *    图片是一个方阵，所以具有宽、高两个属性，除此之外还有一个通道数，比如说灰度图片
 * 的通道数为1，RGB彩色图片的通道数为3。图片的宽高也称为图片的分辨率。
 *
 * 3. 图片在计算机中如何存储？
 *   灰度图片可以看成是二维数组，为方便计算，数据类型使用float。举个例子：
 *   float a[2][3] = {
 *      {121, 231, 35},
 *      {47, 52, 63}
 *   };
 *   就可以看做是一个高为2，宽为3的灰度图片。实际上图片的宽高都比较大，比如说500。
 *
 *   彩色图片也可以看作是由像素构成的二维数组，举个例子，一张高为2，宽为3彩色图片在
 * 内存中的存储为：
 *
 *   低地址 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >>> 高地址
 *
 *    R    G    B    R    G    B    R    G    B    R    G    B    R    G    B    R    G    B
 *   111, 123, 215, 233, 123, 142, 156, 233, 267, 223, 234, 175, 123, 117, 168, 123, 156, 156
 *   |< -------- >| |< -------- >| |< -------- >| |< -------- >| |< -------- >| |< -------- >|
 *     第一个像素      第二个像素      第三个像素       第四个像素     第五个像素     第六个像素
 *   |< -------------------------------------- >| |< -------------------------------------- >|
 *                    第一行像素                                   第二行像素
 *
 *   理解了图片的存储之后，再开始编写代码。
 */


void rgb2gray(int h, int w) {
float rgb[3*h*w];
for(int i=0;i<h*w;i++)
{
    cin>>rgb[i];
}
float gray0[h*w];
for(int i=0;i<h*w;i++)
{
    gray0[i]=0.2989*rgb[i]+0.5870*rgb[i+1]+0.1140*rgb[i+2];
}
float gray[h][w];
for(int i=0;i<h;i++)
{
    for(int j=0;j<w;j++)
    {
        gray[i][j]=gray0[j+j*w];
        cout<<"灰度为"<<gray[i][j]<<"地址为"<<&gray[i][j]<<" ";
    }
cout<<endl;
}
return;
}

// 练习5，实现图像处理算法 resize：缩小或放大图像
#include<iostream>
using namespace std;
void resize(int h,int w,float scale)
{   float x,y;
    cin>>x>>y;

int H=h*scale;
int W=w*scale;

float X=x*scale;
float Y=y*scale;

int x0=static_cast<int>(X);
int y0=static_cast<int>(Y);
cout<<x0<<" "<<y0;
float y2=y0+0.5;
float y1=y0-0.5;
float x1=x0-0.5;
float x2=x0+0.5;
if(y2-y1<H and x2-x1<W){
float a[4];
for(int i=0;i<4;i++)
{
    cin>>a[i];
}

float p1=a[0]*0.5+a[1]*0.5;
float p2=a[2]*0.5+a[3]*0.5;
float p=0.5*p1+0.5*p2;
cout<<p;
return;
}
}


// 练习6，实现图像处理算法：直方图均衡化
#include<iostream>
using namespace std;
void hist_eq(int h, int w) {
int gray[256]={0};
float p[256]={0};//分布频率
float p0[256]={0};//累计分布频率
int gray0[256]={0};//映射后灰度
int n=h*w;//元素总个数n
int a;
int Photo[h*w];
for(int i=0;i++;i<h*w)
{
    cin>>a;
    if(a>=0 and a<=255){Photo[i]=a;
        gray[a]=gray[a]+1;
    }
}
for(int i=0;i<256;i++)
{
    p[i]=gray[i]/n;
}

for(int i=0;i<256;i++)
{
    for(int j=0;j<i;j++)
    {
        p0[i]=p0[i]+p[j];
    }
}

for(int i=0;i<256;i++)
{
    gray0[i]=p0[i]*(n-1);
}
int p1[h*w];
for(int i=0;i<h*w;i++)
{
p1[i]=gray0[Photo[i]];
}

return;
}
